package com.example.his.api.mis.impl;

import cn.hutool.core.map.MapUtil;
import com.example.his.api.common.PageUtils;
import com.example.his.api.db.dao.DeptDao;
import com.example.his.api.db.pojo.DeptEntity;
import com.example.his.api.exception.HisException;
import com.example.his.api.mis.service.DeptService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Service
public class DeptServiceImpl implements DeptService {

  @Resource
  private DeptDao deptDao;

  /**
   * 查询所有部门信息
   *
   * @return 部门信息列表，每个部门包含部门ID、部门名称等信息
   */
  @Override
  public ArrayList < HashMap > searchAllDept() {
    ArrayList < HashMap > list = deptDao.searchAllDept();

    return list;
  }

  /**
   * 分页查询部门信息
   *
   * @param param 查询参数，包含分页信息（page: 当前页码, length: 每页记录数）及其他查询条件
   * @return 分页结果，包含当前页的部门列表及分页信息（总记录数、总页数等）
   */
  @Override
  public PageUtils searchByPage( HashMap param ) {
    ArrayList < HashMap > list = new ArrayList <>();
    long count = deptDao.searchCount( param );
    if ( count > 0 ) {
      list = deptDao.searchByPage( param );
    }
    int page = MapUtil.getInt( param, "page" );
    int length = MapUtil.getInt( param, "length" );
    PageUtils pageUtils = new PageUtils( list, count, page, length );

    return pageUtils;
  }


  /**
   * @param param
   * @return
   */
  @Override
  public Long searchCount( Map param ) {
    return 0L;
  }

  /**
   * @param param
   * @return
   */
  @Override
  @Transactional
  public int insert( DeptEntity param ) {
    int rows = deptDao.insert( param );
    return rows;
  }

  /**
   * 根据部门ID查询部门信息
   *
   * @param id 部门ID
   * @return 部门信息，包含部门ID、部门名称等信息
   */
  @Override
  public HashMap searchById( int id ) {

    HashMap map = deptDao.searchById( id );

    return map;
  }

  /**
   * 更新部门信息
   *
   * @param param 包含要更新的部门信息的实体对象，必须包含部门ID及其他需要更新的字段
   * @return 受影响的行数，通常为1表示更新成功，0表示未找到对应记录或更新失败
   */
  @Override
  @Transactional
  public int update( DeptEntity param ) {
    int rows = deptDao.update( param );
    return rows;
  }

  /**
   * @param ids
   * @return
   */
  @Override
  public boolean searchCanDelete( Integer[] ids ) {
    return false;
  }

  /**
   * 根据部门ID数组删除部门信息
   *
   * @param ids 部门ID数组
   * @return 受影响的行数，表示成功删除的部门数量
   * @throws HisException 当尝试删除有关联用户的部门时抛出异常
   */
  @Override
  @Transactional
  public int deleteByIds( Integer[] ids ) {

    if ( !deptDao.searchCanDelete( ids ) ) {
      throw new HisException( "无法删除关联用户的部门" );
    }

    int rows = deptDao.deleteByIds( ids );

    return rows;
  }
}
